package pwd.allen.handler;

import ch.qos.logback.core.util.DatePatternToRegexUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.ibatis.reflection.MetaObject;

import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;

/**
 * 自定义公共字段填充处理器
 * 使用方式
 *  使用 strictInsertFill 或 strictUpdateFill 方法可以根据注解 FieldFill.xxx、字段名和字段类型来区分填充逻辑。
 *  加入spring容器中即可被mybatis使用，原理：TODO
 *  要处理的字段指定填充策略：@TableField(fill = FieldFill.INSERT_UPDATE)
 *
 *  strictInsertFill：插入时填充默认值；填充的必要条件：1.字段名必须存在；2.字段值必须为null；3.字段类型必须与fillType一致；4.字段必须有指定fill属性
 *
 * @author 门那粒沙
 * @create 2020-06-25 23:25
 **/
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        Object fieldValue = getFieldValByName("msg", metaObject);
        System.out.println(String.format("fill前:msg=【%s】", fieldValue != null ? new String((byte[])fieldValue) : "null"));
        // 如果msg字段为空，则填充默认的值
        this.strictInsertFill(metaObject, "msg", byte[].class, "默认填充值".getBytes());
        fieldValue = getFieldValByName("msg", metaObject);
        System.out.println(String.format("fill后:msg=【%s】", fieldValue != null ? new String((byte[])fieldValue) : "null"));

        strictInsertFill(metaObject, "age", Integer.class, 1);
        try {
            strictInsertFill(metaObject, "createAt", Date.class, DateUtils.parseDate("2025-01-01", "yyyy-MM-dd"));
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
    }
}
